// import com.alibaba.druid.DbType;
// import com.alibaba.druid.sql.ast.SQLExpr;
// import com.alibaba.druid.sql.ast.SQLName;
// import com.alibaba.druid.sql.ast.expr.*;
// import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition;
// import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
// import com.alibaba.druid.sql.ast.statement.SQLSelectItem;
// import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerOutput;
// import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerTop;
// import com.alibaba.druid.sql.dialect.sqlserver.ast.expr.SQLServerObjectReferenceExpr;
// import com.alibaba.druid.sql.parser.Lexer;
// import com.alibaba.druid.sql.parser.SQLExprParser;
// import com.alibaba.druid.sql.parser.SQLParserFeature;
// import com.alibaba.druid.sql.parser.Token;
// import com.alibaba.druid.util.FnvHash;

// import java.util.Arrays;
// import java.util.List;
#pragma once
#include "../../../parser/SQLExprParser.h"

class SQLServerExprParser : virtual public SQLExprParser
{
private:
  static BOOL_ptr __init;
  static BOOL_ptr init();

public:
  static std::shared_ptr<std::vector<string_ptr>> AGGREGATE_FUNCTIONS;

  static std::shared_ptr<std::vector<long>> AGGREGATE_FUNCTIONS_CODES;

  SQLServerExprParser(Lexer_ptr lexer);

  SQLServerExprParser(string_ptr sql);

  SQLServerExprParser(string_ptr sql, SQLParserFeature_list_ptr features);

  SQLExpr_ptr primary();

  SQLSelectParser_ptr createSelectParser();

  SQLExpr_ptr primaryRest(SQLExpr_ptr expr);

  SQLExpr_ptr dotRest(SQLExpr_ptr expr);

  SQLName_ptr nameRest(SQLName_ptr expr);

  SQLServerTop_ptr parseTop();

  SQLServerOutput_ptr parserOutput();

  SQLSelectItem_ptr parseSelectItem();

  SQLColumnDefinition_ptr createColumnDefinition();

  SQLColumnDefinition_ptr parseColumnRest(SQLColumnDefinition_ptr column);
};
